#include <mutex>
#include <thread>
#include <iostream>

int cnt = 0;
//放置在全局的锁
std::mutex mutex;

void thread_1(){
    for(int i = 0;i < 100; i++){
        //尽管更推荐使用std::lock_guard保护该部分代码
        //但是为了更直观的观察mutex的保护范围和行为
        //我们还是使用了更加底层的做法
        //https://en.cppreference.com/w/cpp/thread/lock_guard
        mutex.lock();
        std::cout << "thread_1() " << cnt++ << std::endl;
        mutex.unlock();
    }
}

void thread_2(){
    for(int i = 0;i < 100; i++){
        mutex.lock();
        std::cout << "thread_2() " << cnt++ << std::endl;
        mutex.unlock();
    }
}

int main(){
    //先锁住防止某一个线程开始执行
    mutex.lock();
    std::thread th1(thread_1);
    std::thread th2(thread_2);

    //考虑一下在这里放一句th1.join();会怎么样

    //解锁之后，必定会有一个线程先获得锁的资源，而另外一个线程就只能等待，直到前一个线程释放
    //这样就保证了两个线程会交错输出
    //笔试时大部分的提交无法保证程序初期两个线程也可以交错的输出
    mutex.unlock();

    //考虑在这里将join换成detach会怎么样
    th1.join();
    th2.join();
}
